package com.williams.myo2o.service.impl;

import com.williams.myo2o.dao.ShopDao;
import com.williams.myo2o.dto.ShopExecution;
import com.williams.myo2o.entity.Shop;
import com.williams.myo2o.enums.ShopStateEnum;
import com.williams.myo2o.service.ShopService;
import com.williams.myo2o.util.ImageUtil;
import com.williams.myo2o.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.io.InputStream;
import java.util.Date;

/**
 * @auther williams
 * @create-time 2018-07-28-下午6:29
 */

/**service 层进行事务的处理。
 * 将店铺的信息插入到数据库中，其次返回店铺的id,通过店铺的id创建出存储图片的文件夹，在文件夹下处理存储的图片，最后将文件夹的地址更新回这条数据里去。
 * 分4步进行，其中每一步出错都要进行回滚，因此事务非常必要。
 * */

//只要看到@Service，就表明已经将这个接口的实现类的对象进行依赖注入
//只要成员变量上有@Autowired,就表明这个变量的对象已经进行依赖注入，不需要再new一个对象，而可以直接调用其方法。
//而且成员变量都是接口名，因为 mybatis 的存在，所以不需要写出其实现类，要调用方法都是 接口名.方法名。

@Service
public class ShopServiceImpl implements ShopService {

    @Autowired
    private ShopDao shopDao;

    @Override
    //事务标签
    @Transactional
    public ShopExecution addShop(Shop shop, InputStream shopImgInputStream,String fileName) {
        //空值判断
        if (shop == null) {
            //如果为空，返回 dto 中 ShopExecution 的带参构造方法
            return new ShopExecution(ShopStateEnum.NULL_SHOP_ID);
        }
        try {
            //初始化一些必要的参数
            //setEnableStatus 的初始值为0，意味着店铺在 审核中
            shop.setEnableStatus(0);
            shop.setCreateTime(new Date());
            shop.setLastEditTime(new Date());
            //添加店铺信息
            int effectNums = shopDao.insertShop(shop);
            if (effectNums <= 0) {
                throw new RuntimeException("店铺创建失败");
            }
            //添加成功之后就要来将用户上传的图片打上水印，并生成缩略图重新存放到一个目录
            else {
                //如果添加成功，判断传入的 File shopImgInputStream 是否为空，不为空就将店铺对应的图片存储到对应的目录里
                if (shopImgInputStream != null) {
                    addShopImg(shop, shopImgInputStream,fileName);
                }
                //更新店铺的图片地址
                effectNums = shopDao.updateShop(shop);
                if (effectNums <= 0) {
                    throw new RuntimeException("店铺创建失败");
                }
            }

        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        //在确认一切都没问题后，返回一个成功的标识 —— 0 即待审核
        return new ShopExecution(ShopStateEnum.CHECK,shop);


    }


    //逻辑中需要传入的参数为实体类的属性(如需要传入 shop　的 id),那参数都是传这个实体类，在下面的具体逻辑中传入 shop.getShopId()

    private void addShopImg(Shop shop, InputStream shopImgInputStream,String fileName) {
        //获取shop图片的相对值路径
        String dest = PathUtil.getShopImagePath(shop.getShopId());
        //进 ImageUtil 这个工具类，凭借相对值路径找到用户上传的文件并将其打上水印保存到一个新的地方，这个函数的返回值是这张新生成缩略图的相对路径。也就是说返回了新图的相对路径。
        String shopImgAddr = ImageUtil.generateThumbnail(shopImgInputStream,fileName,dest);
        //并把返回的新的相对路径更新回数据库
        shop.setShopImg(shopImgAddr);
    }
}
